#include <chrono>
#include <iostream>
#include <semaphore>
#include <thread>
#include <chrono>

// 全局二元信号量实例
// 设置对象计数为零
// 对象处于未被发信状态
// std::binary_semaphore bin_sem(0);
std::binary_semaphore bin_sem(1);

void ThreadProc()
{
    std::cout << "[线程] 21 start" << std::endl; // 回应消息
    bin_sem.acquire();
    std::cout << "[线程] 22 获得锁" << std::endl; // 回应消息
    bin_sem.release();
    std::cout << "[线程] 23 释放锁" << std::endl; // 回应消息
    std::this_thread::sleep_for(std::chrono::seconds(3));
}

int main()
{
    // 创建某个工作线程
    std::thread thrWorker(ThreadProc);
    std::cout << "[主] 11 开始\n"; // 消息
    thrWorker.join();
    std::cout << "[主] 12 结束\n"; // 消息

    return 0;
}

/* 测试1: bin_sem(0) 时
[主] 11 开始
[线程] 21 start

 */

/* 测试2: 二元信号量bin_sem(1)时, 可以acquire()成功
主] 11 开始
[线程] 21 start
[线程] 22 获得锁
[线程] 23 释放锁
[主] 12 结束

 */